/**
 * @Author Fizz Pu
 * @Date 2020/8/20 下午8:06
 * @Version 1.0
 * 失之毫厘，缪之千里！
 */

/**
 * 实现 int sqrt(int x) 函数。
 * <p>
 * 计算并返回 x 的平方根，其中 x 是非负整数。
 * <p>
 * 由于返回类型是整数，结果只保留整数的部分，小数部分将被舍去。
 * <p>
 * 示例 1:
 * <p>
 * 输入: 4
 * 输出: 2
 */

public class Leet69 {
    public static void main(String[] args) {
        Leet69 leet69 = new Leet69();
        System.out.println(leet69.mySqrt(4));
        System.out.println(leet69.mySqrt(8));
        System.out.println(leet69.mySqrt(0));
        System.out.println(leet69.mySqrt(15));
        System.out.println(leet69.mySqrt(23));
        System.out.println(leet69.mySqrt(10));
        System.out.println(leet69.mySqrt(9));
        System.out.println(leet69.mySqrt(1));
        System.out.println(leet69.mySqrt(2147395599));
    }

    // 这道为啥会使这样？好难思考。
    public int mySqrt(int x) {
        int low = 0, high = x;
        int res = 0;
        long temp, tempmax;
        while (low <= high) { // 此处的=
            res = low + (high - low) / 2;
            temp = (long) res * res; // 溢出是必须要考虑的，因为res是int ,所以在计算前就要转long，而不是计算后。有乘法必须考虑溢出。
            tempmax = (long) (res + 1) * (res + 1);
            if (temp <= x && x < tempmax) {
                return res;
            } else if (x >= tempmax) {
                low = res + 1;
            } else {
                high = res - 1;
            }
        }
        return res;
    }
}
